home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Madness 2 #12 / Multimedia Madness - Volume 2 - Issue 12 (SAMS Publishing) (November 25, 1992).iso / nemo / paswin / mixapi.doc < prev    next >
Text File  |  1992-03-21  |  38KB  |  1,100 lines

  1.  
  2.  
  3.         Proposed Specification for MIXER API
  4.          copyright Media Vision (c) 1991
  5.            version 0.6b -- Ken Nicholson
  6.  
  7.               
  8.  
  9. MCIMIXER.DRV    MCI interface to the mixer driver
  10. MMMIXER.DLL      Multimedia Mixer DLL
  11. MVMIXER.DRV    Media Vision Mixer driver
  12.  
  13.  
  14. THE MULTIMEDIA MIXER DLL
  15.  
  16. The Multimedia Windows Mixer DLL, as proposed by Media Vision, is a
  17. library of generalized routines that provides a common,    device-independent
  18. interface to software controllable mixers.  Its design is based on the uses
  19. and functionality of real world audio mixers.
  20.  
  21. This DLL gives the MultiMedia application programmer control over a complete
  22. range of audio capabilites.  Every conceivable audio mixing, patching,
  23. equalization and amplification need can be handled by this DLL and its API.
  24. It is capable of supporting mixing features far beyond those available
  25. with today's PC hardware.
  26.  
  27.  
  28. WHY A MULTIMEDIA MIXER ?
  29.  
  30. The Multimedia PC Specification version 1 (May 13,1991) calls for 
  31. "On-board analog audio mixing capabilities," requiring "... input
  32. from three (recommended four) sources and [must] present the sources as
  33. a stereo, line-level audio signal at the back panel. ... Individual
  34. audio source and master digital volume control registers and extra
  35. line-level audio sources are highly recommended."
  36.  
  37. Such hardware requires a set of standard functions calls (API's) that
  38. will handle volume changes in a device-independent and extensible way.
  39. Furthermore, there are a number of issues, apart from the setting of
  40. an input's or an output's volume levels, that should be handled in a
  41. standard way.  Functions such as equalization, special effects, patch
  42. changes, device association, connection mapping, smooth timed transitions,
  43. power-up settings and device sharing were not addressed by the November Beta
  44. release of the Multimedia Windows Development Kit.
  45.  
  46. What is provided? The WAVEOUT and MIDIOUT drivers have Get- and SetVolume
  47. entry points for control of a device's output volume.  In addition, the
  48. Multimedia Extensions define an AUX device type that allows
  49. applications to get and set the volumes of additional devices.  The
  50. only two types of AUX devices defined are CD audio and auxillary
  51. input.
  52.  
  53. In the current design of the Multimedia Extensions, there is no link
  54. between an AUX device and the audio device associated with it.  It
  55. may be assumed, when there is only one AUX device, that it controls
  56. the audio output of the CD-ROM drive.  But in the presence of multiple
  57. AUX devices there is no mechanism for an application to determine 
  58. which AUX device to control to change the CD volume.  Varying
  59. AUX-to-Device association will cause chaos for application writers.
  60.  
  61. This raises the question of volume control for devices in general.
  62. Most consumer audio devices (cassette decks, turntables, video disk
  63. players, televisions) don't have a variable line output. These
  64. devices rely on a mixer or integrated amplifier to control the volume
  65. level.  The term "attenuator" is applied to controls that vary the
  66. line output of a device. 
  67.  
  68. Attenuation of PCM and MIDI audio output is not something users need
  69. concern themselves with and therefore volume control functions do not
  70. belong in waveout and midiout drivers; volume control is properly a
  71. mixing function.  Users and multimedia authors will want to individually
  72. adjust the relative volumes of a number of device outputs and this is the
  73. primary need for a mixer.  The Mixer API solves this problem by supporting
  74. volume controls on each of any number of mixer inputs as well supporting
  75. volume controls for each mixer output.
  76.  
  77. Some professional audio mixers feature a myriad of knobs to enhance or
  78. alter input audio.  Among these are controls for bass, midrange and treble, 
  79. controls to add reverb, effects and stereo-mono crossover.  In fact, Media
  80. Vision's Pro-Audio Spectrum supports many of these features.  The
  81. existing Multimedia Windows API's don't address these features.
  82.  
  83. Another feature of the MMMIXER.DLL API set is its ability to maintain and
  84. coordinate mixer patch information.  A mixer device that supports
  85. software selectable input patching would allow any one of several audio
  86. devices to be "patched" to a mixer input.  Similarly an application
  87. can interrogate the mixer API to find out which devices are connected
  88. to which mixer inputs.
  89.  
  90. Fading the volume up of one sound source while fading out the volume
  91. of another seems such an intrinsically necessary function for multimedia
  92. that we have incorporated it into the DLL.  Without this feature, the
  93. application programmer would be required to send auxSetVolume
  94. messages in "ping-pong" fashion to the devices to be cross-faded.
  95.  
  96. Some users will have powered speakers with no volume control. MMWindows
  97. start-up sounds are capable of producing DEAFENING DECIBELS OF DIN. 
  98. Mixer drivers conforming to this spec read WIN.INI to determine the
  99. desired start-up, or mixer reset, volume settings.
  100.  
  101. Frequently an application will fill the entire screen and on occasion
  102. a Multimedia application will suprise the user with unexpectedly loud
  103. audio.  Such moments find the user frantically trying to bring up the
  104. volume control application in order to lower the volume.  An equally 
  105. dismaying situation is starting a multimedia application only to
  106. discover that the volumes are too low for the sound to be audible.
  107. The MMMIXER.DLL intercepts the CTRL-ALT-U and CTRL-ALT-D sequences
  108. and translates them into driver volume up and down calls.  This
  109. allows the user to quickly change volumes up and down.
  110.  
  111. Media Vision has developed the Multimedia Windows DLL to address these and
  112. other issues in audio control on the MPC.  We gratefully acknowledge 
  113. Microsoft and especially the members of the Multimedia Windows
  114. Development Team for their advice and assistance in developing the
  115. Multimedia Mixer DLL and the Media Vision Mixer driver.
  116.                         
  117.  
  118. MEDIA VISION IMPLEMENTATION
  119.  
  120. The Multimedia Mixer DLL is capable of supporting virtually any type
  121. of mixing hardware.  The limitations of the Pro AudioSpectrum mixing 
  122. hardware should not be confused with the capabilities of the
  123. Multimedia Mixer DLL.
  124.  
  125. MVMIXER.DRV is implemented as a single Mixer device.  This mixer has
  126. seven input lines and two output lines.  The Pro AudioSpectrum 16 has
  127. new mixer circuitry that allows 8 input lines.
  128.  
  129. The standard input lines are by default patched to:
  130. 1) FM SYNTHESIZER          5) MICROPHONE
  131. 2) RECORD MONITOR              6) WAVE (PCM)
  132. 3) AUXILLARY INPUT          7) PC speaker
  133. 4) INTERNAL CD              8) Snd Blaster WAVE (mono PCM)    
  134.  
  135. On the Pro AudioSpectrum and Pro AudioSpectrum Plus, Input #2 is the mix
  136. of all devices being routed to Output #2.  For the Pro AudioSpectrum 16,
  137. Input #2 becomes a second internal CD connector.
  138.  
  139. Each input can be connected to one (but not both) of the two outputs.
  140. 1) PLAY      (Line Out)
  141. 2) RECORD (Wave In)
  142.  
  143. Output #1, apart from supporting volume control, supports treble and
  144. bass, loudness, stereo enhance and mute.
  145. Output #2  supports volume control on the Pro-16 only.      
  146.  
  147. Input #2 should not be patched to Output #2. 
  148. Input #6 should be patched to Output #2 during playback for proper
  149. waveform filtering.  This is only necessary on the 8-bit Pro
  150. AudioSpectrum.
  151.  
  152. mixGetDevCaps returns the following structure:
  153.     
  154. MIXERCAPS MVMixer= {
  155.     MM_MEDIAVISION,             // manufacturer id
  156.     MM_PROAUD_MIXER,        // product id
  157.     (VERSION) 0x100,          // version of the driver
  158.     "Pro AudioSpectrum",    // product name (NULL terminated string)
  159.     7,                // number of inputs  supported.
  160.     2,                // number of outputs supported.
  161.     9,                 // number of input patches supported.
  162.     3,                // number of output patches supported.
  163.     MIXERCAP_MANUALPATCHSWITCH,    // supports some manual   patching
  164.     NULL            // reserved
  165.     };
  166.  
  167.  
  168.  
  169. A Line Capabaility structure for the Pro Audio Spectrum Mixer
  170. would look like this:
  171. {
  172. wNumber        =0;              // This is the current caps for input # 0
  173. dwDeviceType=MIX_MICROPHONE    // Microphone currently patched;
  174.         +MIX_USER_CONNECTED;// Requires user to plug it in (for prompting)
  175. wNumSoftPatches=1;           // This input always patched to the Microphone
  176. wPatchNumber=0;               // the only mic
  177. wNumChannels=2;               // The mic is actually mono with a splitter
  178. dwSupport   =MIX_SUPPORT_LRVOLUME    // supported functionality 
  179. szIOname    ="Line 1: Microphone Jack"    // Input Name
  180. szPname     ="MIC";              // patch name 
  181. }
  182.  
  183.  
  184.  
  185. Each Mixer has a built in number of INPUT and OUTPUT patches. They
  186. are referenced by an ordinal number starting from zero.  Patch number
  187. zero is always defined as NO CONNECT.
  188.  
  189. Here is the capability structure for Output #1:
  190.  
  191. {
  192. wPatchNumber =1;                // This patch's ordinal number
  193. dwDeviceType =MIX_AMPLIFIER|      // device connected is amplifier
  194.           MIX_LISTENER|      // all output patches are listeners
  195.               MIX_USER_CONNECTED; // requires a cable connection
  196. dwLineNumbers=1<<0;           // bit-field, lines connectable to
  197. szPname[]    ="MASTER";          // patch name (NULL terminated string)
  198. dwAssociation=NULL;             // HIWORD=type, LOWORD=device
  199. dwReserved1  =NULL;              // reserved for future use
  200.  
  201.  
  202.  
  203. //////////////////////////////////////////////////////////////////////
  204. //////////////////////////////////////////////////////////////////////
  205.  
  206.  
  207.                 MIXER API OVERVIEW
  208.  
  209.  
  210.  
  211. MIXER GENERAL FUNCTIONS:
  212.  
  213. mixGetNumDevs         - returns the number of mixer devices
  214. mixGetDevCaps         - provides information on mixer device capability
  215. mixOpen         - opens mixer device
  216. mixClose        - closes mixer device
  217. mixGetErrorText     - gets a text string corresponding to error number
  218.  
  219. MIXER PRESET FUNCTIONS:
  220.  
  221. mixReset        - resets mixer inputs, volumes, patches etc.
  222. mixGetState         - gets current state of the mixer device
  223. mixSetState        - sets mixer state with optional timed fade
  224. mixGetFadeStatus    - returns time remaining of current fadeprocess
  225.  
  226. // INPUT TO OUTPUT CONNECTION 
  227.  
  228. mixGetConnections    - gets the connection map of an input or output
  229. mixSetConnections    - sets input to output connection map
  230.  
  231. // LINE CONTROLS
  232. mixGetControl        - gets the setting of a line's control
  233. mixSetControl        - sets the level of a line's control
  234. mixGetLineInfo        - gets functionality and current status of a line
  235.  
  236. // PATCH CALLS
  237. mixGetPatch        - gets a line's patch number
  238. mixSetPatch        - sets a line's patch information
  239. mixGetPatchInfo        - returns information on a standard mixerpatch
  240.  
  241. // DEVICE ORIENTED CALLS
  242. mixGetDeviceName    - converts device type to device name
  243. mixGetDeviceLines    - finds which lines have a specified device 
  244. mixSetDeviceConnections    - performs abstract device connection
  245. mixGetDeviceConnections - determines device types connected
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252. MIXER DEVICE GENERAL FUNCTIONS
  253.  
  254. mixGetNumDevs         - returns the number of mixer devices
  255. mixGetDevCaps         - provides information on mixer device capability
  256. mixOpen         - opens mixer device
  257. mixClose        - closes mixer device
  258. mixGetErrorText     - gets a text string corresponding to error number
  259.  
  260.  
  261. ______________________________________________________________________
  262.  
  263.  
  264. Syntax        WORD mixGetNumDevs(void)
  265.         This function retrieves the number of mixer devices
  266.         present in the system.
  267.  
  268. Parameters    None
  269.  
  270. Return Value    Returns the number of mixer devices present in the
  271.         system
  272.  
  273. ______________________________________________________________________
  274.  
  275. Syntax        mixGetDevCaps(wDeviceID, lpCaps, wSize)
  276.  
  277. Parameters    WORD  wDeviceID
  278.           Identifies the mixer device to be queried.
  279.  
  280.         LPMIXERCAPS  lpCaps
  281.           Specifies a far pointer to a MIXERCAPS structure. 
  282.           This structure is filled with information about the
  283.           capabilities of the device.            
  284.  
  285.         WORD  wSize    
  286.           Specifies the size of the MIXERCAPS structure.
  287.  
  288. Return Value    When the wDeviceID is non-zero, the return value will
  289.         be MIXERR_NOERR (zero) if the function was successful.
  290.         If wDeviceID is zero, the return value is the size of 
  291.         the drivers MIXERCAPS structure.
  292.  
  293. Comments    Use mixGetDevCaps to determine the number of mixer
  294.         devices present in the system.  The Device ID specified
  295.         by wDeviceID varies from zero to one less than the number
  296.         of devices present. Only wSize bytes(or less of information
  297.         will be copied to the location pointed to by lpCaps.  If
  298.         wSize is 0, nothing will be copied and MMSYSERR_NOERROR is
  299.         returned.
  300.  
  301.  
  302. See Also    mixGetNumDevs
  303. ______________________________________________________________________
  304.  
  305. Syntax        mixOpen(lphMixer, wDeviceID, dwFlags)
  306.         
  307.         This function opens a specified mixer device.
  308.         
  309.  
  310. Parameters    LPHMIXER lphMixer
  311.           Specifies a far pointer to an HMIXER handle.  This
  312.           location is filled with a handle identifying the
  313.           opened mixer device.
  314.         
  315.  
  316.         WORD  wDeviceID
  317.  
  318.         DWORD dwFlags
  319.           Specifies flags for opening the device
  320.  
  321.  
  322. Return Value    Returns zero if the function was successful. 
  323.         Otherwise, it returns an error. 
  324.  
  325. Comments    Use mixOpen before making any control/enquiry calls
  326.         to the mixer driver.
  327.         
  328.  
  329. See Also    mixClose
  330. ______________________________________________________________________
  331.  
  332. Syntax        mixClose(hMixer)
  333.  
  334. Parameters    HMIXER    hMixer
  335.  
  336. Return Value    Returns zero if the function was successful. 
  337.         Otherwise, it returns an error. Possible errors are:
  338.  
  339.         MMSYSERR_INVALHANDLE
  340.            Specified device handle is invalid.
  341.  
  342. See Also    mixOpen
  343. ______________________________________________________________________
  344.  
  345. Syntax        mixGetErrorText(wError, lpText, wSize)
  346.     
  347.         This function retrieves a textual description of the
  348.         error identified by the specified error number.
  349.  
  350. Parameters    WORD  wError
  351.           Specifies the error number.
  352.  
  353.         LPSTR lpText
  354.           Specifies a far pointer to a buffer which is filled
  355.           with the textual error description.
  356.  
  357.         WORD  wSize
  358.           Specifies the length of the buffer pointerd to by
  359.           lpText.
  360.  
  361. Return Value    Returns the length of the string copied to zero if the function was successful. 
  362.           
  363. ______________________________________________________________________
  364.  
  365.  
  366.  
  367.  
  368. MIXER PRESET FUNCTIONS
  369.  
  370. mixReset        - resets mixer inputs, volumes, patches etc.
  371. mixGetState         - gets current state of the mixer device
  372. mixSetState        - sets current state of the mixer device
  373. mixGetFadeStatus    - returns time remaining of current fadeprocess
  374.  
  375.  
  376. ______________________________________________________________________
  377.  
  378. Syntax        mixReset(hMixer)
  379.  
  380.         Resets the mixer to a default state.  The default
  381.         state is read from the WIN.INI file.
  382.  
  383. Parameters    HMIXER    hMixer
  384.           Identifies the mixer device to be reset.
  385.  
  386.  
  387. Return Value    Returns zero if the function was successful. 
  388.         Otherwise, it returns an error.
  389.  
  390. See Also    mixOpen, mixGetSetup, mixSetSetup
  391.  
  392. ______________________________________________________________________
  393.  
  394. Syntax        mixGetState(hMixer, lphMixerState, lpwSize)
  395.  
  396.         Returns a handle to a structure containing the
  397.         current state of the mixer.  The structure is
  398.         defined by the device.
  399.  
  400. Parameters    HMIXER     hMixer
  401.           Identifies the mixer device to be used.
  402.  
  403.         LPHANDLE lphMixerState
  404.           Specifies a far pointer to a handle to where the mixer
  405.           state information is saved.
  406.  
  407.         LPWORD   lpwSize
  408.           Specifies a far pointer to a word where the size of
  409.           the mixer state information is stored.
  410.  
  411.  
  412. Return Value    Returns zero if the function was successful. 
  413.         Otherwise, it returns an error. Possible errors are:
  414.  
  415.         MIXERR_BADMIXERPTR    null pointer to mixer
  416.           
  417. Comments    This function is used to save the current state of 
  418.         the specified mixer device.  
  419.  
  420. See Also    mixSetState
  421. ______________________________________________________________________
  422.  
  423. Syntax        mixSetState(hMixer,lpMixerState,wSize,dwTime,
  424.                 dwFlags,dwCallback);
  425.     
  426.         Restores the mixer to a saved state.
  427.  
  428. Parameters    HMIXER    hMixer
  429.           Identifies the mixer device to be used.
  430.  
  431.         LPMIXERSTATE lpMixerState
  432.           Handle to a mixer state structure as returned by
  433.           the mixGetState function.
  434.  
  435.         WORD    wSize
  436.           Size of the mixer state structure.
  437.  
  438.         DWORD    dwTime
  439.           The high word is delay time in tenths of seconds.
  440.           The low word is the duration of the fade in tenths
  441.           of seconds.  A dwTime value of zero results in an
  442.           instant mixer setting.
  443.  
  444.         DWORD    dwFlags
  445.           MIX_FADE_OVERRIDE    override a fade in progress
  446.         
  447.         DWORD    dwCallback
  448.           Address of a procedure to be called when fade is
  449.           complete.  Note: this has not yet been implemented
  450.  
  451.  
  452. Return Value    Returns zero if the function was successful. 
  453.         Otherwise, it returns an error. Possible errors are:
  454.  
  455.         MIXERR_FADEINPROGRESS    
  456.           
  457.           
  458. Comments    If wSize is not correct, this function will be
  459.         rejected.
  460.  
  461. See Also    mixGetState, mixGetFadeStatus
  462.  
  463. ______________________________________________________________________
  464.  
  465. Syntax        mixGetFadeStatus(hMixer,lpdwTime)
  466.  
  467. Parameters    HMIXER     hMixer
  468.           Identifies the mixer device to be used.
  469.  
  470.         LPDWORD  lpdwTime
  471.           The high word is the delay time remaining in tenths
  472.           of seconds.
  473.           The low word is the fade time remaining in tenths
  474.           of seconds.
  475.           An lpdwTime value of zero indicates no fade is in
  476.           progress.
  477.  
  478. Return Value    Returns zero if the function was successful. 
  479.  
  480. Comments    Status indicators displaying the time remaining of
  481.         a fade may wish to call this function upon receipt of
  482.         any of the following MIXER MESSAGES:
  483.  
  484.           WM_MIX_CONTROLCHANGED      
  485.           WM_MIX_CONNECTIONCHANGED  
  486.           WM_MIX_PATCHCHANGED      
  487.  
  488. See Also     mixSetState
  489.         
  490.  
  491. ______________________________________________________________________
  492.  
  493.  
  494.  
  495.  
  496. // INPUT TO OUTPUT CONNECTION 
  497.  
  498. mixGetConnections    - gets the connection map of an input or output
  499. mixSetConnections    - sets input to output connection map
  500.  
  501. ______________________________________________________________________
  502.  
  503. Syntax        mixGetConnections(hMixer,WORD wLine, LPDWORD lpdwConnections);
  504.  
  505. Parameters    HMIXER     hMixer
  506.           Identifies the mixer device to be used.
  507.  
  508.         WORD      wLine
  509.           The low byte indicates the mixer line to get the
  510.           connections information for.
  511.           The high byte indicates whether the line is an
  512.           input line or an output line. The following 
  513.           macros (equates) are used for the high byte:
  514.               MIX_INPUT    
  515.               MIX_OUTPUT
  516.  
  517.         LPDWORD  lpdwConnections
  518.           A far pointer to a DWORD where the connection
  519.           information is to be stored.  Each bit of the
  520.           double word represents a mixer line.  If the
  521.           bit is 1, wLine is connected to that line.
  522.           For example, assume wLine=0x0000, indicating Input
  523.           Line #1.  If that Input line is connected to Output
  524.           Line #0, bit 0 of *lpdwConnections will be set.
  525.           Logically, connection information can only be
  526.           maintained for a mixer with a maximum of 32 inputs
  527.           and 32 outputs.    
  528.  
  529. Return Value    Returns zero if the function was successful. 
  530.         Possible Errors:
  531.             MIXERR_INVALINPUT        illegal input line    
  532.             MIXERR_INVALOUTPUT       illegal output line 
  533.  
  534. Comments    
  535.  
  536. See Also     mixSetConnections
  537.         
  538.  
  539. ______________________________________________________________________
  540.  
  541.  
  542. Syntax        mixSetConnections(Mixer,WORD wLine, DWORD dwConnections);
  543.  
  544. Parameters    HMIXER     hMixer
  545.           Identifies the mixer device to be used.
  546.                    '
  547.         WORD      wLine
  548.           The low byte indicates the mixer line to get the
  549.           connections information for.
  550.           The high byte indicates whether the line is an
  551.           input line or an output line. The following 
  552.           macros (equates) are used for the high byte:
  553.               MIX_INPUT    
  554.               MIX_OUTPUT
  555.               
  556.         DWORD  dwConnections
  557.           This parameter specifies the connection map for the
  558.           given line of the mixer.  If wLine refers to an
  559.           input Line, the outputs specified by this parameter
  560.           will be connected to that input. Bit 0 refers to
  561.           line 0, bit 1 to line 1, etc.
  562.  
  563.  
  564. Return Value    Returns zero if the function was successful. 
  565.         Possible Errors:
  566.             MIXERR_INVALINPUT        illegal input line    
  567.             MIXERR_INVALOUTPUT       illegal output line 
  568.  
  569. Comments    This function allows inputs to be selectively patched
  570.         to one or more outputs.  It also allows outputs to
  571.         be connected to one or more inputs.  This function
  572.         allows the caller to say "connect input lines 1, 3 and 5
  573.         to output #1" or "connect input line 4 to outputs 1 and 2"
  574.         If the hardware cannot support all connections requested,
  575.         the mixer driver will connect the lower numbered lines
  576.         first.  Calling mixGetConnections after    mixSetConnections
  577.         is recommended for verification of requested connections.
  578.  
  579. See Also     mixGetConnections
  580.         
  581.  
  582. ______________________________________________________________________
  583.  
  584.  
  585.  
  586.  
  587. // LINE CONTROLS
  588. mixGetControl        - gets the setting of a line's control
  589. mixSetControl        - sets the level of a line's control
  590. mixGetLineInfo        - gets support functionality of a line
  591.  
  592. ______________________________________________________________________
  593.  
  594. Syntax        mixGetControl(hMixer, wLineNum, dwControl, lpdwSetting);
  595.  
  596. Parameters    HMIXER    hMixer
  597.           Identifies the mixer device to be used.
  598.  
  599.         WORD      wLineNum
  600.           The low byte indicates the mixer line to get the
  601.           connections information for.
  602.           The high byte indicates whether the line is an
  603.           input line or an output line. The following 
  604.           macros (equates) are used for the high byte:
  605.               MIX_INPUT    
  606.               MIX_OUTPUT
  607.  
  608.         DWORD    dwControl
  609.           Specifies the control to get the setting of.
  610.           Here is the current list of possible controls:
  611.  
  612.               MIX_SUPPORT_LRVOLUME       left-right volume control
  613.               MIX_SUPPORT_ALC                Auto Level Control
  614.               MIX_SUPPORT_BMT                B-M-T equalization
  615.               MIX_SUPPORT_CROSSOVER      crossover change
  616.               MIX_SUPPORT_LOUDNESS       loudness equalization
  617.               MIX_SUPPORT_MUTE                channel mute
  618.               MIX_SUPPORT_REVERB     reverb 
  619.               MIX_SUPPORT_STEREOENHANCE  stereo enhance 
  620.               MIX_SUPPORT_CUSTOM1     custom effect #1
  621.               MIX_SUPPORT_CUSTOM2     custom effect #2
  622.               MIX_SUPPORT_CUSTOM3     custom effect #3
  623.  
  624.         LPDWORD lpdwSetting
  625.           Specifies a far pointer to a location that will be
  626.           filled with the current Control setting.  For
  627.           stereo controls, the high-order word of this
  628.           location contains the left channel setting and
  629.           the low-order word contains the right channel setting.
  630.           A value of 0xFFFF represents full intensity and a value
  631.           of 0x0000 is full cutout.
  632.  
  633. Return Value    Returns zero if the function was successful. 
  634.         Otherwise, it returns an error. Possible errors are:
  635.  
  636.             MIXERR_INVALINPUT        illegal input line    
  637.             MIXERR_INVALOUTPUT       illegal output line 
  638.             MIXERR_NOTSUPPORTED            control not supported     
  639.  
  640.           
  641. See Also    mixSetControl
  642. ______________________________________________________________________
  643.  
  644. Syntax        mixSetControl(hMixer, wLineNum, dwControl, dwSetting)
  645.  
  646. Parameters    HMIXER    hMixer
  647.           Identifies the mixer device to be used.
  648.  
  649.          WORD    wLineNum
  650.           The low byte indicates the mixer line to get the
  651.           connections information for.
  652.           The high byte indicates whether the line is an
  653.           input line or an output line. The following 
  654.           macros (equates) are used for the high byte:
  655.               MIX_INPUT    
  656.               MIX_OUTPUT
  657.           Specifies the input to set Control for
  658.  
  659.         DWORD    dwControl
  660.           Specifies the control to set
  661.           Here is the current list of possible controls:
  662.  
  663.               MIX_SUPPORT_LRVOLUME       left-right volume control
  664.               MIX_SUPPORT_ALC           Auto Level Control
  665.               MIX_SUPPORT_BMT           B-M-T equalization
  666.               MIX_SUPPORT_CROSSOVER      crossover change
  667.               MIX_SUPPORT_LOUDNESS       loudness equalization
  668.               MIX_SUPPORT_MUTE           channel mute
  669.               MIX_SUPPORT_REVERB           reverb 
  670.               MIX_SUPPORT_STEREOENHANCE  stereo enhance 
  671.               MIX_SUPPORT_CUSTOM1           custom effect #1
  672.               MIX_SUPPORT_CUSTOM2           custom effect #2
  673.               MIX_SUPPORT_CUSTOM3           custom effect #3
  674.  
  675.         DWORD    dwSetting
  676.           Specifies a far pointer to a location that will be
  677.           filled with the current Control setting.  For
  678.           stereo controls, the high-order word of this
  679.           location contains the left channel setting and
  680.           the low-order word contains the right channel setting.
  681.           A value of 0xFFFF represents full intensity and a value
  682.           of 0x0000 is full cutout.
  683.  
  684. Return Value    Returns zero if the function was successful. 
  685.         Otherwise, it returns an error. Possible errors are:
  686.  
  687.             MIXERR_INVALINPUT        illegal input line    
  688.             MIXERR_INVALOUTPUT       illegal output line 
  689.             MIXERR_NOTSUPPORTED       control not supported     
  690.           
  691. See Also    mixGetControl, CONTROL SETTING NOTES
  692.  
  693. _____________________________________________________________________
  694.  
  695.  
  696. Syntax        mixGetLineInfo(hMixer, wLineNum, lpInfo, wSize);
  697.  
  698.         Retrieves information about the specified input's
  699.         capabilities.
  700.  
  701. Parameters    HMIXER    hMixer
  702.           Identifies the mixer device to be used.
  703.  
  704.         WORD      wLineNum
  705.           The low byte indicates the mixer line to get the
  706.           connections information for.
  707.           The high byte indicates whether the line is an
  708.           input line or an output line. The following 
  709.           macros (equates) are used for the high byte:
  710.               MIX_INPUT    
  711.               MIX_OUTPUT
  712.  
  713.         LPMIXERLINEINFO  lpInfo
  714.           Specifiies a far pointer to be filled with the capability
  715.           information for the specified input.
  716.  
  717.         WORD  wSize    
  718.           Specifies the size of the LPMIXERLINEINFO structure.
  719.  
  720.  
  721. Return Value    Returns zero if the function was successful. 
  722.  
  723. Comments    
  724.  
  725. See Also    
  726.  
  727. ______________________________________________________________________
  728.  
  729.  
  730. // PATCH CALLS
  731. mixGetPatch        - gets a line's patch number
  732. mixSetPatch        - sets a line's patch information
  733. mixGetPatchInfo        - returns information on a standard mixerpatch
  734.  
  735. ______________________________________________________________________
  736.  
  737. Syntax        mixGetPatch(hMixer,wLineNum, lpwPatchNum);
  738.  
  739.         Returns information regarding a specific input patch
  740.         that can be selected into an input
  741.  
  742. Parameters    HMIXER    hMixer
  743.           Identifies the mixer device to be used.
  744.  
  745.         WORD      wLineNum
  746.           The low byte indicates the mixer line to get the
  747.           connections information for.
  748.           The high byte indicates whether the line is an
  749.           input line or an output line. The following 
  750.           macros (equates) are used for the high byte:
  751.               MIX_INPUT    
  752.               MIX_OUTPUT
  753.  
  754.         LPWORD    lpwPatchNum
  755.           Destination for the patch number.  A value of -1
  756.           signifies a user-defined patch.              
  757.           
  758. Return Value    Returns zero if the function was successful. 
  759.         Otherwise, it returns an error. Possible errors are:
  760.         
  761.             MIXERR_INVALINPUT        illegal input line    
  762.             MIXERR_INVALOUTPUT       illegal output line 
  763.  
  764. Comments    The range of wPatchNum must be from 0 to 1 less than
  765.         the number of software patches returned in 
  766.         mixGetDevCaps.
  767.  
  768. See Also    mixSetPatch, mixGetPatchInfo
  769.  
  770. ______________________________________________________________________
  771.  
  772. Syntax        mixSetPatch(hMixer,wLine, wPatchNum,lpPatch,wSize);
  773.  
  774.         Allows the user to set the patch of an input to
  775.         another device.  
  776.  
  777. Parameters    HMIXER    hMixer
  778.           Identifies the mixer device to be used.
  779.  
  780.         WORD      wLine
  781.           The low byte indicates the mixer line to get the
  782.           connections information for.
  783.           The high byte indicates whether the line is an
  784.           input line or an output line. The following 
  785.           macros (equates) are used for the high byte:
  786.               MIX_INPUT    
  787.               MIX_OUTPUT
  788.                                
  789.         WORD    wPatchNum
  790.           Specifies the patch number to set.  Each mixer
  791.           driver has a number of internal patches that
  792.             are selected by this parameter.    
  793.           
  794.         LPPATCHINFO lpInfo
  795.           If this parameter is not NULL, the wPatchNum
  796.           parameter is ignored and the PATCHINFO structure
  797.           pointed to is used to set the patch information.
  798.           The patch number assigned will be -1;    
  799.  
  800.         WORD    wSize
  801.           Specifies size of PATCHINFO structure
  802.  
  803.  
  804. Return Value    Returns zero if the function was successful. 
  805.         Otherwise, it returns an error. Possible errors are:
  806.           
  807.             MIXERR_INVALINPUT        illegal input line    
  808.             MIXERR_INVALOUTPUT       illegal output line 
  809.             MIXERR_PATCHMISMATCH   patch-to-line mismatch
  810.  
  811. Comments    The MIX_USER_CONNECTED bit may be OR'd with the patch
  812.         type to indicate a patch that is to be connected by
  813.         the user rather than one that is selected via
  814.         software control.  Applications should check this bit
  815.         at initialization time to advise users to make the
  816.         external connection.  If the patch number of a user-
  817.         connected patch is illegal, the driver's default
  818.         patch for that line will be used.
  819.         
  820. See Also    mixGetPatchInfo, mixGetPatch
  821. ______________________________________________________________________
  822.  
  823. Syntax        mixGetPatchInfo(hMixer,wPatchNum,lpInfo,wSize);
  824.  
  825.         Returns information about a pre-defined patch.
  826.  
  827. Parameters    HMIXER    hMixer
  828.           Identifies the mixer device to be used.
  829.  
  830.         WORD    wPatchNum
  831.           Specifies the patch number to set.  Each mixer
  832.           driver has a number of internal patches that
  833.             are selected by this parameter.
  834.           
  835.         LPPATCHINFO lpInfo
  836.           If this parameter is not NULL, the wPatchNum
  837.           parameter is ignored and the PATCHINFO structure
  838.           pointed to is used to set the patch information.
  839.  
  840.         WORD    wSize
  841.           Specifies size of PATCHINFO structure
  842.  
  843.  
  844. Return Value    Returns zero if the function was successful. 
  845.         Otherwise, it returns an error. Possible errors are:
  846.           
  847.             MIXERR_INVALPATCH        patch number out of range
  848.  
  849. Comments    The current patch information for a line is  
  850.         available by calling mixGetLineInfo.  Now that 
  851.         patch information is stored in WIN.INI, the default
  852.         patch information is automatically overridden.  In
  853.         most cases the wPatchNum will be -1.  User defined
  854.         patch information is not returned by this call.
  855.  
  856.         
  857. See Also    mixGetPatch, mixSetPatch, mixGetLineInfo
  858. ______________________________________________________________________
  859.  
  860. // DEVICE ORIENTED CALLS
  861. mixGetDeviceName    - converts device type to device name
  862. mixGetDeviceLines    - finds which lines have a specified device 
  863. mixSetDeviceConnections    - performs abstract device connection
  864. mixGetDeviceConnections - determines device types connected
  865.  
  866. ______________________________________________________________________
  867.  
  868. Syntax        mixGetDeviceName(dwDeviceType, lpDeviceName, wSize);
  869.  
  870.         Returns information regarding a specific input patch
  871.         that can be selected into an input
  872.  
  873. Parameters    DWORD    dwDeviceType
  874.           A 32-bit value indication the device type
  875.  
  876.         LPSTR    lpDeviceName
  877.           points to the destination for the device name
  878.  
  879.         WORD      wSize
  880.           buffers size pointed to by lpDeviceName    
  881.           If wSize <= MIX_DEVICESHORTNAME, the three letter
  882.           standard device mnemonic string will be copied to 
  883.           the buffer.  In all cases wSize will be the limit
  884.           of characters copied.
  885.           
  886. Return Value    Returns zero if the function was successful. 
  887.         
  888. Comments    The device short name is intended for display in
  889.         dialog boxes and in win.ini's mixer configuration
  890.         settings.  
  891.  
  892. See Also    mixGetDeviceLines, mixGetDeviceConnections
  893.  
  894. ______________________________________________________________________
  895.  
  896.  
  897. Syntax        mixGetDeviceLines(hMixer,lpDeviceLines);
  898.         
  899. ///  Given a device type, this function will report the lines that the given
  900. ///  device is connected to.  If the association is not NULL, only
  901. ///  lines with the same association will be reported.  Otherwise, all
  902. ///  devices of the given type are reported on. 
  903. ///
  904.  
  905. Parameters    HMIXER    hMixer
  906.           Identifies the mixer device to be used.
  907.  
  908.         LPDEVICELINES lpDeviceLines
  909.           far pointer to DEVICELINES data structure
  910.  
  911.         struct {
  912.         DWORD     dwDeviceType;     // aka technology
  913.         WORD    wNumDevices;     // return value: # lines with device found
  914.         DWORD    dwLines;     // return value: line map
  915.         DWORD    dwAssociation;     // for exclusive search
  916.         } DEVICELINES;
  917.  
  918. typedef DEVICELINES FAR *LPDEVICELINES;
  919.  
  920.           
  921.           
  922. Return Value    Returns zero if the function was successful. 
  923.  
  924. Comments    Be sure that the dwAssociation element of the
  925.         DEVICELINES structure is NULL unless you intend
  926.         to find a specific device line of which the
  927.         association has been established.
  928.  
  929. See Also    mixGetDeviceConnections, mixGetPatchInfo
  930.  
  931. ______________________________________________________________________
  932.  
  933. Syntax        mixGetDeviceConnections(hMixer,lpDeviceConnect);
  934.  
  935.  
  936.         Given a device type, this function will return device
  937.         types that the given device type is connected to.  
  938.         Input device types will yield reporting of output device
  939.         types connected and vice versa.  If the associationType
  940.         is given, only devices with the same association
  941.         will be reported.  Otherwise, all devices of the given
  942.         type are reported on.
  943.  
  944.  
  945. Parameters    HMIXER    hMixer
  946.           Identifies the mixer device to be used.
  947.  
  948.  
  949.         LPDEVICECONNECT    lpDeviceConnect
  950.           long pointer to DEVICECONNECT structure
  951.  
  952.         typedef struct{  
  953.         DWORD dwInputDeviceType;
  954.         DWORD dwOutputDeviceType;
  955.         DWORD dwInputAssociation;
  956.         DWORD dwOutputAssociation;
  957.         } DEVICECONNECT;
  958.  
  959.           
  960. Return Value    Returns zero if the function was successful. 
  961.         Otherwise, it returns an error. Possible errors are:
  962.         
  963.             MIXERR_INVALSTRUCTPTR  null lpDeviceConnect
  964.  
  965. Comments    An output device type is one that can be connected to
  966.         a mixer output and is distingquished by having the
  967.         MIX_LISTENER bit set in its dwDeviceType field.     
  968.  
  969. See Also    mixSetDeviceConnections
  970.  
  971. ______________________________________________________________________
  972.  
  973. Syntax        mixSetDeviceConnections(hMixer,lpDeviceConnect)
  974.  
  975.         Given two device types, input and output, this function
  976.         will attempt to connect the two types.  If the
  977.         associationType and associationValue fields are not NULL,
  978.         only devices with the same association will be
  979.         connected.  
  980.  
  981. Parameters    HMIXER    hMixer
  982.           Identifies the mixer device to be used.
  983.  
  984.         LPDEVICECONNECT    lpDeviceConnect
  985.           long pointer to DEVICECONNECT structure
  986.  
  987.         typedef struct{  
  988.         DWORD dwInputDeviceType;
  989.         DWORD dwOutputDeviceType;
  990.         DWORD dwInputAssociation;
  991.         DWORD dwOutputAssociation;
  992.         } DEVICECONNECT;
  993.  
  994.  
  995. Return Value    Returns zero if the function was successful. 
  996.         Otherwise, it returns an error. Possible errors are:
  997.         
  998.             MIXERR_INVALSTRUCTPTR  null lpDeviceConnect
  999. Comments    
  1000.  
  1001. See Also    mixGetDeviceConnections
  1002.  
  1003. ______________________________________________________________________
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009. CONTROL SETTING NOTES
  1010.  
  1011. The functions mixGetControl and mixSetInputControl
  1012. have a dwControl parameter and a dwSetting parameter.
  1013.  
  1014. Following the example set by Microsoft's volume settings, each
  1015. control setting will have associated with it a double word value
  1016. for specifying its setting.
  1017.  
  1018. dwControl         description            format    
  1019. ---------         -----------            ------
  1020.  
  1021. MIX_SUPPORT_VOLUME     volume control               LLLL:RRRR scalar
  1022. MIX_SUPPORT_LRVOLUME       left-right volume control    LLLL:RRRR scalar
  1023. MIX_SUPPORT_ALC         Auto Level Control        LLLL:RRRR on/off
  1024. MIX_SUPPORT_BMT         B-M-T equalization        --BB:MMTT scalar
  1025. MIX_SUPPORT_CROSSOVER     crossover change             MIXCROSSCAPS
  1026. MIX_SUPPORT_LOUDNESS     loudness equalization        LLLL:RRRR on/off
  1027. MIX_SUPPORT_MUTE         mute - don't change volume    LLLL:RRRR on/off
  1028. MIX_SUPPORT_REVERB     reverb             LLLL:RRRR scalar
  1029. MIX_SUPPORT_STEREOENHANCE  stereo enhance         LLLL:RRRR on/off
  1030. MIX_SUPPORT_CUSTOM1     custom effect #1        LLLL:RRRR on/off
  1031. MIX_SUPPORT_CUSTOM2     custom effect #2        LLLL:RRRR scalar
  1032.  
  1033. Scalars are unsigned values from 0-65535 except in the case of BMT
  1034. where they are unsigned values from 0-255.  These values should be
  1035. interpolated to match the mixer hardware's scale.
  1036.  
  1037. On/Off values are ON for any non-zero value.
  1038.  
  1039. //////////////////////////////////////////////////////////////////////
  1040.  
  1041.  
  1042. MCI INTERFACE
  1043.  
  1044. Media Vision is now providing an MCI driver for controlling the mixer
  1045. hardware.  For many of you, this will make the control of mixing
  1046. functions much easier than it ever has been.
  1047.  
  1048. MCI, as you must know, stands for Media Control Interface.  In the
  1049. case of a mixer, there is no media (medium).  When we speak of 
  1050. CDs, wave files, MIDI, we connote some sort of media transport,
  1051. (ie. position within the data, support for PLAY, STOP, REWIND, etc)
  1052.  
  1053. A PLAY command sent to a mixer does not make sense.  In fact most MCI
  1054. commands have little meaning for a mixer.
  1055.  
  1056. Still, MCI is powerful.  One of its outstanding features is its
  1057. ability to convert strings into driver commands.  We have, therefore,
  1058. developed an MCI driver for Multimedia Windows.
  1059.  
  1060. The documentation for the MCI mixer is found in the file
  1061. mcimixer.doc.
  1062.  
  1063. //////////////////////////////////////////////////////////////////////
  1064.  
  1065. MIXER NOTES:
  1066.  
  1067. The mixSetState function allows timed fades.  If it would be useful
  1068. to developers we can add the capability for timed fades to the
  1069. mixSetControl function.  Let us know if you want this.  Soon.
  1070.  
  1071. User-defined patches are not accessible through mixGetPatchInfo.
  1072. The mechanism of user-defined patches may change in the future.
  1073.  
  1074.  
  1075. //////////////////////////////////////////////////////////////////////
  1076. GLOSSARY:
  1077.  
  1078. line - a stereo input or output of a mixer
  1079.  
  1080. patch - the association of a line to a particular sound producing
  1081.     or recording device
  1082.  
  1083. connection - this term refers to a mixer's internal input-to-output
  1084.      routing of an audio signal     
  1085.  
  1086. control    - the capability to modify an audio signal (ie volume)
  1087.  
  1088. cross-fade  - fading one or more controls up while fading other out
  1089.     
  1090.  
  1091.  
  1092. //////////////////////////////////////////////////////////////////////
  1093.  
  1094.  
  1095.  
  1096.  
  1097.  
  1098.  
  1099.